import json

from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render, redirect
from django.contrib import auth


# Create your views here.

# 进入主页
from myapp.models import *


@login_required
def into_home(request):
    res = {}
    res["username"] = request.user.username
    res["hrefs"] = list(DB_href.objects.all().values())
    res["notice"] = DB_notice.objects.all()[::-1]  # 倒序
    res["diy_tools"] = DB_DIY_tools.objects.filter(owner=request.user.id)
    return render(request, 'home.html', res)


# 进入登录页面
def into_login(request):
    return render(request, 'login.html', {})


# 登录   表单获取前端输入框数据
def login_act(request):
    print("开始登录")
    # 获取用户名 密码
    username = request.POST.get("user", None)
    pwd = request.POST.get("pwd", None)
    # print(username, pwd)
    # 去用户表中查询这个用户名和密码 能否找到用户
    user = auth.authenticate(username=username, password=pwd)
    # print(user) 验证成功打印数据库表里的queryset的__str__, 失败则打印None
    if user:
        # 登录成功
        auth.login(request, user)
        request.session["user"] = username
        # return render(request, 'home.html', {"username": request.user.username})
        return into_home(request)  # 进入页面可能会带很多数据，里面也会用多个函数，所以改为下面这种调用方式
    else:
        # 登录失败
        # return redirect("/login/")
        return into_login(request)


# 注销
def logout(request):
    auth.logout(request)
    return redirect('/home/')


# 注册 非表单获取前端输入框数据
def register_act(request):
    # 获取数据
    username = request.POST.get("user")
    pwd = request.POST.get("pwd")
    # print(username, pwd)

    # 注册
    try:
        user = User.objects.create_user(username=username,password=pwd)
        user.save()

        # 登录
        auth.login(request, user)
        request.session["user"] = username
        # 跳转home页
        return redirect("/home/")  # 进入页面可能会带很多数据，里面也会用多个函数，所以改为下面这种调用方式
    except:
        return render(request,'login.html',{"error_msg":"注册失败！！！！！"})



def add_href(request):
    new_link_name = request.GET.get("new_link_name")
    new_link_url = request.GET.get("new_link_url")
    # print(new_link_name,new_link_url)

    link = DB_href.objects.create(name=new_link_name, url=new_link_url)
    link.save()
    return into_home(request)

def get_diy_tools_list(request):
    res = {}
    res['tool_list'] = list(DB_DIY_tools.objects.all().values())
    return HttpResponse(json.dumps(res),content_type='application/json')


def test(request):
    return render(request, 'test.html')


def power(icon):
    def f1(func):
        def f2(*args,**kwargs):
            try:
                userIds = DB_power.objects.filter(icon=icon)[0].userIds # 空   #不符合规范  # 正常
            except:
                userIds = ["1",]
            # request 这个参数在args 这个列表里
            if str(args[0].user.id) in userIds:
                return func(*args, **kwargs)
            else:
                return HttpResponse("权限不足，请联系管理员")
        return f2
    return f1


# 写统计
def useCount_write(icon):
    uc = DB_useCount.objects.get_or_create(icon=icon)[0]
    uc.counts += 1
    uc.save()

    ...

# 读统计
def useCount_read(request):
    '''
        [{},{},{}]    列表不能直接传给前端，前端会识别成一个 字符串 --》 '[{},{},{}]'
        所以我们要再给它包上一层  res={ "ret": [{"a":"b"},{},{}]}    变成json字符串,json可以很好的帮我解决 单双引号问题及 True False 写法的 自动转换
    '''
    res = {}
    ret = list(DB_useCount.objects.all().values())
    res = {"ret": ret}
    return JsonResponse(res)


def get_useCount(request):
    objs = DB_useCount.objects.all()
    return render(request, 'data.html', locals())



def get_data(request):
    res = []
    count_data = list(DB_useCount.objects.all().values())
    print(count_data)
    for i in count_data:
        tmp = [i["icon"], i["counts"]]
        res.append(tmp)
    print(res)
    return JsonResponse({"res":res})


def test2(request):

    # 查询出Person对象信息，也就是数据表中的所有数据
    # 一行数据就是一个对象，一个格子的数据就是一个对象的一个属性值
    objs = Person.objects.all()

    # locals函数可以将该函数中出现过的所有变量传入到展示页面中，即index.html文件中

    return render(request,'test2.html', locals())
